﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Domain
{
    /// <summary>
    /// Стратегия выбора лучшего времени из всех заездов
    /// </summary>
    /// <remarks>Если участник был дисквалифицирован хотя бы в одном заезде, то его результат не вычисляется.
    /// Если участник не имеет времени ни в одном заезде, то он считается не финишировавшим.</remarks>
    public class BestTimeSummStrategy: IRunResultSummStrategy
    {
        #region Implementation of IRunResultSummStrategy

        /// <summary>
        /// Получить итоговое время участника
        /// </summary>
        /// <param name="runResults">Результаты всех заездов</param>
        /// <returns>Итоговый результат</returns>
        public RunResult GetSummResult(Dictionary<Run, RunResult> runResults)
        {
            RunResult result;

            if (runResults.Values.Any(r => r.ResultType == RunResultType.DSQ))
                result = new RunResult(null, RunResultType.DSQ);
            else
            {
                TimeSpan? best = null;
                foreach (RunResult runResult in runResults.Values)
                {
                    if (runResult.Time != null)
                    {
                        if (best != null)
                        {
                            if (runResult.Time < best)
                                best = runResult.Time;
                        }
                        else
                        {
                            best = runResult.Time;
                        }
                    }
                }

                if (best != null)
                    result = new RunResult(best, RunResultType.Normal);
                else
                    result = new RunResult(null, RunResultType.DNF);
            }

            return result;
        }

        #endregion
    }
}
